package tk.mybatis.springboot.share.util;

import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;

/**
 * 百度地图设置
 * @title:BaiDuMapSetting
 */
public class BaiDuMapUtil {

	/** 地图外网地址 */
	public static final String base_url = "http://api.map.baidu.com/";

	/** 百度api地址 */
	public static String api_url = "http://api.map.baidu.com/";

	/** xing申请的百度ak */
	public static String AK = "qlqUdUCcPWlt6hGEOqHvP18XvKAhThoG";

	/** 测试的SK(在权限为sn的时候使用，权限为ip则无视) */
	//	public static final String SK = "gNWONkLFe7zQTC5wDKCG07uoR0cRHafz";

	/**（暂时使用ip权限模式）
	 * 根据地址返回当前地址的经纬度，详见（http://lbsyun.baidu.com/index.php?title=webapi/guide/webservice-geocoding#.E4.BB.80.E4.B9.88.E6.98.AFGeocoding.EF.BC.9F）
	 * @param address  lat<纬度>,lng<经度> {"status":0,"result":{"location":{"lng":104.00546099968526,"lat":30.713333863680587},"precise":1,"confidence":80,"level":"道路"}}
	 * @return
	 */
	public static JSONObject getGeocoderByAdd(String address) {
		JSONObject json = new JSONObject();

		Map<String, String> map = new LinkedHashMap<String, String>();

		map.put("output", "json");
		map.put("address", address);
		map.put("ak", BaiDuMapUtil.AK);

		String rest = HttpUtil.sendGet(BaiDuMapUtil.api_url + "geocoder/v2/", map);

		try {
			json = JSONObject.fromObject(rest);
		} catch (Exception e) {
			System.out.println("调用经纬度出错");
			return null;
		}

		return json;
	}

	/**
	 * 根据经纬度得到当前位置的地址      ***,*** 得到某市某县某。。。
	 * @param address
	 * @return
	 */
	public static String getAddressByGeocoder(String longitude, String latitude) {

		String address = "";
		if (StringUtils.isEmpty(longitude) || StringUtils.isEmpty(latitude)) {
			return null;
		}

		Map<String, String> map = new LinkedHashMap<String, String>();

		map.put("output", "json");
		map.put("coordtype", "bd09ll");
		map.put("location", latitude + "," + longitude);
		map.put("ak", BaiDuMapUtil.AK);

		String rest = HttpUtil.sendGet(BaiDuMapUtil.api_url + "geocoder/v2/", map);

		try {
			JSONObject json = new JSONObject();
			json = JSONObject.fromObject(rest);

			if (json.getString("status") != null && "0".equals(json.getString("status"))) {
				JSONObject result = (JSONObject) json.get("result");
				address = result.getString("formatted_address");

				//详细信息
				//				address += result.getString("sematic_description");

			}

		} catch (Exception e) {
			System.out.println("调用经纬度出错");
			return null;
		}

		return address;
	}

	/**
	 * 返回经纬度
	 * @param address 
	 * @return 键值对，key = lng<经度>  key =  lat<纬度>
	 */
	public static Map<String, String> getLatLngByAdd(String address) {
		Map<String, String> map = new HashMap<String, String>();
		JSONObject json = getGeocoderByAdd(address);

		String lng = "0";
		String lat = "0";

		if (null != json && json.getString("status").equals("0")) {

			JSONObject result = json.getJSONObject("result");
			JSONObject location = result.getJSONObject("location");
			lng = location.getString("lng");
			lat = location.getString("lat");
		} else {
			//System.out.println(json.toString());
		}
		map.put("lng", lng);
		map.put("lat", lat);

		return map;
	}

	/**
	 * 根据经纬度调用相距距离
	 * @param start_lat 开始纬度
	 * @param start_lng 开始经度
	 * @param end_lat 结束纬度
	 * @param end_lng 结束经度
	 * @return 	{"result":[{"duration":{"text":"15.7小时","value":56596},"distance":{"text":"900.4公里","value":900400}}],"message":"成功","status":0}
	 */
	public static JSONObject getAddByGeocoder(String start_lat, String start_lng, String end_lat, String end_lng) {
		JSONObject json = new JSONObject();

		Map<String, String> map = new LinkedHashMap<String, String>();

		//开始经纬度
		map.put("origins", start_lat + "," + start_lng);
		//结束经纬度
		map.put("destinations", end_lat + "," + end_lng);
		//返回类型
		map.put("output", "json");
		//经纬度类型，默认百度的
		map.put("coord_type", "bd09ll");
		//10 不走高速；11 最短时间；12 最短路径；13 最短 距离(不考虑路况);其中10-12 都考虑实时路况，若希望计算最可靠的最短路线距离，建议使用不考虑实时路况的默认值13。
		map.put("tactics", "10");

		map.put("ak", BaiDuMapUtil.AK);

		String rest = HttpUtil.sendGet(BaiDuMapUtil.api_url + "routematrix/v2/driving/", map);

		try {
			json = JSONObject.fromObject(rest);
		} catch (Exception e) {
			System.out.println("根据经纬度返回距离有误");
		}

		return json;
	}

	/**
	 * 根据经纬解析出相距多少米
	 * @param start_lat 开始纬度
	 * @param start_lng 开始经度
	 * @param end_lat 结束纬度
	 * @param end_lng 结束经度
	 * @return 单位米
	 */
	public static int getAddByGeocoder_lc(String start_lat, String start_lng, String end_lat, String end_lng) {
		int value = 0;
		JSONObject json = new JSONObject();
		try {
			json = getAddByGeocoder(start_lat, start_lng, end_lat, end_lng);
		} catch (Exception e) {
			System.out.println("根据经纬度返回距离有误");
		}

		if (json.getString("status") != null && "0".equals(json.getString("status"))) {
			JSONArray result = (JSONArray) json.get("result");
			//第一个是里程，第二个是耗时
			JSONObject distances = result.getJSONObject(0);
			JSONObject distance = distances.getJSONObject("distance");

			String cou = distance.getString("value");

			value = Integer.parseInt(cou);
		}
		return value;
	}

	public static void main(String[] args) {
		System.out.println(getAddByGeocoder_lc("30.839504", "104.116583", "32.814464", "108.896243"));
		//		System.out.println(getAddressByGeocoder("104.067923", "30.679943"));
	}
}
